Suggested Citation:

Mendez C. (2020). Making maps in R: Using the sf and tmap Packages. R Studio/RPubs. Available at https://rpubs.com/quarcs-lab/tutorial-maps-in-r

This work is licensed under the Creative Commons Attribution-Share Alike 4.0 International License.

2 Tutorial objectives

  • Load spatial data files into R
  • Join non-spaital data to spatial data files
  • Create simple choropleth maps

3 Orginal data sources

The non-spatial datafile is from:

The spatial (shapefile) is from:

4 Import the data

4.1 Non-spatial data

4.1.1 Explore the data

## Observations: 67
## Variables: 7
## $ id      <int> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 2…
## $ growth  <dbl> 0.0254, -0.0254, 0.0773, 0.2583, 0.0709, 0.0247, 0.1059, 0.03…
## $ base    <dbl> 6.157, 5.900, 5.896, 5.315, 5.923, 6.198, 6.075, 6.173, 6.150…
## $ T       <dbl> 3.585, 2.896, 2.763, 3.140, 2.785, 4.118, 3.296, 3.163, 2.740…
## $ E       <dbl> 5.216, 3.458, 4.995, 3.478, 4.805, 5.492, 4.852, 5.131, 5.146…
## $ G       <dbl> 6.192, 6.048, 5.950, 5.354, 5.940, 6.200, 6.113, 6.219, 6.155…
## $ Coastal <int> 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0…

4.1.1.1 Definitions of variables

  • growth: growth rate of per capita real income 1987-2001
  • base: lograrithm of the per apita income in the base year 1987
  • T: average terrorism index
  • E: average years of schooling
  • G: real per capita government expenditures in 1987
  • Coastal: dummy variable which takes the value of one if the province is a coastal province.

4.2 Spatial data

4.2.1 Explore the data

## Observations: 67
## Variables: 21
## $ ObjectID   <int> 1946, 1949, 1952, 1957, 2116, 2150, 2186, 2236, 2278, 2371…
## $ NAME       <chr> "Adana", "Adiyaman", "Afyon", "Agri", "Amasya", "Antalya",…
## $ COUNTRY    <chr> "Turkey", "Turkey", "Turkey", "Turkey", "Turkey", "Turkey"…
## $ ISO_CODE   <chr> "TR01", "TR02", "TR03", "TR04", "TR05", "TR07", "TR08", "T…
## $ ISO_CC     <chr> "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR"…
## $ ISO_SUB    <chr> "01", "02", "03", "04", "05", "07", "08", "09", "10", "11"…
## $ ADMINTYPE  <chr> "Province", "Province", "Province", "Province", "Province"…
## $ DISPUTED   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ NOTES      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ AUTONOMOUS <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ COUNTRYAFF <chr> "Turkey", "Turkey", "Turkey", "Turkey", "Turkey", "Turkey"…
## $ CONTINENT  <chr> "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "A…
## $ Land_Type  <chr> "Primary land", "Primary land", "Primary land", "Primary l…
## $ Land_Rank  <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5…
## $ Shape_Leng <dbl> 8.589, 5.355, 6.698, 6.553, 4.831, 10.889, 4.740, 6.039, 9…
## $ Shape_Area <dbl> 1.6029, 0.8622, 1.4795, 1.1537, 0.6232, 2.1533, 0.7467, 0.…
## $ idnum      <int> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19…
## $ province   <chr> "Adana", "Adiyaman", "Afyon", "Agri", "Amasya", "Antalya",…
## $ id         <dbl> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19…
## $ name_esri  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ geometry   <POLYGON [°]> POLYGON ((36.44 38.22, 36.4..., POLYGON ((39.15 38…
  • Check the Coordinate Reference System
## Coordinate Reference System:
##   EPSG: 4326 
##   proj4string: "+proj=longlat +datum=WGS84 +no_defs"

5 Transform the data

No need to transform any data because both datasets share a common variable id

6 Merge the data

6.1 Keep data as sf object

  • Keep the data as sf class, so we will not lose the coodinate system
## Coordinate Reference System:
##   EPSG: 4326 
##   proj4string: "+proj=longlat +datum=WGS84 +no_defs"
## Observations: 67
## Variables: 27
## $ id         <dbl> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19…
## $ growth     <dbl> 0.0254, -0.0254, 0.0773, 0.2583, 0.0709, 0.0247, 0.1059, 0…
## $ base       <dbl> 6.157, 5.900, 5.896, 5.315, 5.923, 6.198, 6.075, 6.173, 6.…
## $ T          <dbl> 3.585, 2.896, 2.763, 3.140, 2.785, 4.118, 3.296, 3.163, 2.…
## $ E          <dbl> 5.216, 3.458, 4.995, 3.478, 4.805, 5.492, 4.852, 5.131, 5.…
## $ G          <dbl> 6.192, 6.048, 5.950, 5.354, 5.940, 6.200, 6.113, 6.219, 6.…
## $ Coastal    <int> 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0…
## $ ObjectID   <int> 1946, 1949, 1952, 1957, 2116, 2150, 2186, 2236, 2278, 2371…
## $ NAME       <chr> "Adana", "Adiyaman", "Afyon", "Agri", "Amasya", "Antalya",…
## $ COUNTRY    <chr> "Turkey", "Turkey", "Turkey", "Turkey", "Turkey", "Turkey"…
## $ ISO_CODE   <chr> "TR01", "TR02", "TR03", "TR04", "TR05", "TR07", "TR08", "T…
## $ ISO_CC     <chr> "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR"…
## $ ISO_SUB    <chr> "01", "02", "03", "04", "05", "07", "08", "09", "10", "11"…
## $ ADMINTYPE  <chr> "Province", "Province", "Province", "Province", "Province"…
## $ DISPUTED   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ NOTES      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ AUTONOMOUS <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ COUNTRYAFF <chr> "Turkey", "Turkey", "Turkey", "Turkey", "Turkey", "Turkey"…
## $ CONTINENT  <chr> "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "A…
## $ Land_Type  <chr> "Primary land", "Primary land", "Primary land", "Primary l…
## $ Land_Rank  <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5…
## $ Shape_Leng <dbl> 8.589, 5.355, 6.698, 6.553, 4.831, 10.889, 4.740, 6.039, 9…
## $ Shape_Area <dbl> 1.6029, 0.8622, 1.4795, 1.1537, 0.6232, 2.1533, 0.7467, 0.…
## $ idnum      <int> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19…
## $ province   <chr> "Adana", "Adiyaman", "Afyon", "Agri", "Amasya", "Antalya",…
## $ name_esri  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ geometry   <POLYGON [°]> POLYGON ((36.44 38.22, 36.4..., POLYGON ((39.15 38…

7 Plot Thematic Maps

7.1 Quick Map

  • A quick map of the Terrorism variable

7.7 Set color intervals

Enter “style =” followed by one of the options below.

  • equal: divides the range of the variable into n parts.
  • pretty: chooses a number of breaks to fit a sequence of equality spaced ‘round’ values.
  • quantile: equal number of cases in each group
  • jenks: looks for natural breaks in the data
  • cat: when the variable is categorical

Change the number of intervals in the color scheme and how the intervals are spaced. Changing the number of intervals n = 7. So, we have 7 shades instead of the default 5.

7.9 Add borders

You can edit the borders of the shapefile with the tm_borders() function which has many arguments. alpha denotes the level of transparency on a scale from 0 to 1 where 0 is completely transparent.

7.12 Interactive map

## tmap mode set to interactive viewing
## tmap mode set to plotting

8 Save a new shapefile

10 Datasets

END

LS0tCnRpdGxlOiAiTWFraW5nIG1hcHMgaW4gUjoiCnN1YnRpdGxlOiAiVXNpbmcgdGhlIHNmIGFuZCB0bWFwIFBhY2thZ2VzIgphdXRob3I6ICJDYXJsb3MgTWVuZGV6IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICAgIHRvY19kZXB0aDogNAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93IgogICAgdGhlbWU6ICJjb3NtbyIKICAgIGhpZ2hsaWdodDogIm1vbm9jaHJvbWUiCiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogbm8KICAgICAgc21vb3RoX3Njcm9sbDogbm8KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CmJpYmxpb2dyYXBoeTogYmlibGlvLmJpYgotLS0KCgo8c3R5bGU+CmgxLnRpdGxlIHtmb250LXNpemU6IDE4cHQ7IGNvbG9yOiBEYXJrQmx1ZTt9IApib2R5LCBoMSwgaDIsIGgzLCBoNCB7Zm9udC1mYW1pbHk6ICJQYWxhdGlubyIsIHNlcmlmO30KYm9keSB7Zm9udC1zaXplOiAxMnB0O30KLyogSGVhZGVycyAqLwpoMSxoMixoMyxoNCxoNSxoNntmb250LXNpemU6IDE0cHQ7IGNvbG9yOiAjMDAwMDhCO30KYm9keSB7Y29sb3I6ICMzMzMzMzM7fQphLCBhOmhvdmVyIHtjb2xvcjogIzhCM0E2Mjt9CnByZSB7Zm9udC1zaXplOiAxMnB4O30KPC9zdHlsZT4KCgpTdWdnZXN0ZWQgQ2l0YXRpb246IAoKPiBNZW5kZXogQy4gKDIwMjApLiAgTWFraW5nIG1hcHMgaW4gUjogVXNpbmcgdGhlIHNmIGFuZCB0bWFwIFBhY2thZ2VzLiBSIFN0dWRpby9SUHVicy4gQXZhaWxhYmxlIGF0IDxodHRwczovL3JwdWJzLmNvbS9xdWFyY3MtbGFiL3R1dG9yaWFsLW1hcHMtaW4tcj4KClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZSBBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAKIVtdKExpY2Vuc2UucG5nKQoKCiMgTGlicmFyaWVzCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmc9RkFMU0UpCgpsaWJyYXJ5KHRpZHl2ZXJzZSkgICMgTW9kZXJuIGRhdGEgc2NpZW5jZSB3b3JrZmxvdwpsaWJyYXJ5KHNmKSAgICAgICAgICMgU2ltcGxlIGZlYXR1cmVzIGZvciBSCmxpYnJhcnkodG1hcCkgICAgICAgIyBUaGVtYXRpYyBNYXBzCmxpYnJhcnkodG1hcHRvb2xzKSAgIyBUaGVtYXRpYyBNYXBzIFRvb2xzCmxpYnJhcnkoUkNvbG9yQnJld2VyKSAjIENvbG9yQnJld2VyIFBhbGV0dGVzCmxpYnJhcnkobGVhZmxldCkgICAgIyBJbnRlcmFjdGl2ZSB3ZWIgbWFwcwpsaWJyYXJ5KHJnZGFsKSAgICAgICMgQmluZGluZ3MgZm9yIHRoZSBHZW9zcGF0aWFsIERhdGEgQWJzdHJhY3Rpb24gTGlicmFyeQpsaWJyYXJ5KHJnZW9zKSAgICAgICMgSW50ZXJmYWNlIHRvIEdlb21ldHJ5IEVuZ2luZSAtIE9wZW4gU291cmNlIAoKCiMgQ2hhbmdlIHRoZSBwcmVzZW50YXRpb24gb2YgZGVjaW1hbCBudW1iZXJzIHRvIDQgYW5kIGF2b2lkIHNjaWVudGlmaWMgbm90YXRpb24Kb3B0aW9ucyhwcm9tcHQ9IlI+ICIsIGRpZ2l0cz00LCBzY2lwZW49OTk5KQpgYGAKCiMgVHV0b3JpYWwgb2JqZWN0aXZlcwoKLSBMb2FkIHNwYXRpYWwgZGF0YSBmaWxlcyBpbnRvIFIgCi0gSm9pbiBub24tc3BhaXRhbCBkYXRhIHRvIHNwYXRpYWwgZGF0YSBmaWxlcwotIENyZWF0ZSBzaW1wbGUgY2hvcm9wbGV0aCBtYXBzCgoKIyBPcmdpbmFsIGRhdGEgc291cmNlcwoKVGhlIG5vbi1zcGF0aWFsIGRhdGFmaWxlIGlzIGZyb206IAoKLSDDlmNhbCwgTi4sICYgWWlsZGlyaW0sIEouICgyMDEwKS4gW1JlZ2lvbmFsIGVmZmVjdHMgb2YgdGVycm9yaXNtIG9uIGVjb25vbWljIGdyb3d0aCBpbiBUdXJrZXk6IEEgZ2VvZ3JhcGhpY2FsbHkgd2VpZ2h0ZWQgcmVncmVzc2lvbiBhcHByb2FjaC5dKGh0dHBzOi8vam91cm5hbHMuc2FnZXB1Yi5jb20vZG9pL2Ficy8xMC4xMTc3LzAwMjIzNDMzMTAzNjQ1NzYpIEpvdXJuYWwgb2YgUGVhY2UgUmVzZWFyY2gsIDQ3KDQpLCA0NzctNDg5LgoKVGhlIHNwYXRpYWwgKHNoYXBlZmlsZSkgaXMgZnJvbTogCgotIFtNYXR0aGV3IEMuIEluZ3JhbV0oaHR0cDovL21hdHRpbmdyYW0ubmV0LykKCgojIEltcG9ydCB0aGUgZGF0YQoKCiMjIE5vbi1zcGF0aWFsIGRhdGEKCmBgYHtyfQpkYXQgPC1yZWFkLmNzdigiREFUQVNFVC5jc3YiKQpgYGAKCiMjIyBFeHBsb3JlIHRoZSBkYXRhCgpgYGB7cn0KZ2xpbXBzZShkYXQpIApgYGAKCiMjIyMgRGVmaW5pdGlvbnMgb2YgdmFyaWFibGVzCgotIGdyb3d0aDogZ3Jvd3RoIHJhdGUgb2YgcGVyIGNhcGl0YSByZWFsIGluY29tZSAxOTg3LTIwMDEKLSBiYXNlOiBsb2dyYXJpdGhtIG9mIHRoZSBwZXIgYXBpdGEgaW5jb21lIGluIHRoZSBiYXNlIHllYXIgMTk4NwotIFQ6IGF2ZXJhZ2UgdGVycm9yaXNtIGluZGV4Ci0gRTogYXZlcmFnZSB5ZWFycyBvZiBzY2hvb2xpbmcKLSBHOiByZWFsIHBlciBjYXBpdGEgZ292ZXJubWVudCBleHBlbmRpdHVyZXMgaW4gMTk4NwotIENvYXN0YWw6IGR1bW15IHZhcmlhYmxlICB3aGljaCB0YWtlcyB0aGUgdmFsdWUgb2Ygb25lIGlmIHRoZSBwcm92aW5jZSBpcyBhIGNvYXN0YWwgcHJvdmluY2UuCgoKCiMjIFNwYXRpYWwgZGF0YQoKYGBge3J9Cm1hcERhdGEgPC0gcmVhZF9zZigiTUFQLnNocCIpCmBgYAoKIyMjIEV4cGxvcmUgdGhlIGRhdGEKCmBgYHtyfQpnbGltcHNlKG1hcERhdGEpCmBgYAoKLSBDaGVjayB0aGUgQ29vcmRpbmF0ZSBSZWZlcmVuY2UgU3lzdGVtCgpgYGB7cn0Kc3RfY3JzKG1hcERhdGEpCmBgYAoKCiMgVHJhbnNmb3JtIHRoZSBkYXRhCgpObyBuZWVkIHRvIHRyYW5zZm9ybSBhbnkgZGF0YSBiZWNhdXNlIGJvdGggZGF0YXNldHMgc2hhcmUgYSBjb21tb24gdmFyaWFibGUgYGlkYAoKCiMgTWVyZ2UgdGhlIGRhdGEKCgpgYGB7cn0KZGF0X21hcCA8LSBpbm5lcl9qb2luKAogIGRhdCwKICBtYXBEYXRhLAogIGJ5ID0gImlkIgopCmBgYAoKIyMgS2VlcCBkYXRhIGFzIHNmIG9iamVjdAoKLSBLZWVwIHRoZSBkYXRhIGFzIHNmIGNsYXNzLCBzbyB3ZSB3aWxsIG5vdCBsb3NlIHRoZSBjb29kaW5hdGUgc3lzdGVtCgpgYGB7cn0KZGF0X21hcCA8LSBzdF9hc19zZihkYXRfbWFwKQpzdF9jcnMobWFwRGF0YSkKYGBgCgpgYGB7cn0KZ2xpbXBzZShkYXRfbWFwKQpgYGAKCgoKIyBQbG90IFRoZW1hdGljIE1hcHMKCgojIyBRdWljayBNYXAgCgotIEEgcXVpY2sgbWFwIG9mIHRoZSBUZXJyb3Jpc20gdmFyaWFibGUKCmBgYHtyfQpxdG0oZGF0X21hcCwgZmlsbCA9ICJUIikKYGBgCgoKIyMgU2ltcGxlIE1hcAoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgdG1fZmlsbCgiVCIpIApgYGAKCgojIyBSZW1vdmUgZnJhbWUKCmBgYHtyfQp0bV9zaGFwZShkYXRfbWFwKSArIAogIHRtX2ZpbGwoIlQiKSArCiAgdG1fbGF5b3V0KGZyYW1lID0gRkFMU0UpCmBgYAoKCiMjIFNldCBsZWdlbmQgb3V0c2lkZQoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgdG1fZmlsbCgiVCIpICsKICB0bV9sYXlvdXQobGVnZW5kLm91dHNpZGUgPSBUUlVFLCBmcmFtZSA9IEZBTFNFKQpgYGAKCiMjIFNldCBjb2xvciBwYWxldHRlCgpTZWUgY29sb3IgcmVmZXJlbmNlIFtoZXJlXShodHRwczovL3d3dy5kYXRhbm92aWEuY29tL2VuL2Jsb2cvdGhlLWEtei1vZi1yY29sb3JicmV3ZXItcGFsZXR0ZS8pCgpgYGB7cn0KdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwgcGFsZXR0ZSA9ICJHcmVlbnMiKSArCiAgdG1fbGF5b3V0KGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwgZnJhbWUgPSBGQUxTRSkKYGBgCgpgYGB7cn0KdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwgcGFsZXR0ZSA9ICItR3JlZW5zIikgKwogIHRtX2xheW91dChsZWdlbmQub3V0c2lkZSA9IFRSVUUsIGZyYW1lID0gRkFMU0UpCmBgYAoKCmBgYHtyfQp0bV9zaGFwZShkYXRfbWFwKSArIAogIHRtX2ZpbGwoIlQiLCBwYWxldHRlID0gInZpcmlkaXMiKSArCiAgdG1fbGF5b3V0KGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwgZnJhbWUgPSBGQUxTRSkKYGBgCgoKIyMgQWRkIHBvbHlnb24gbmFtZXMKCmBgYHtyfQp0bV9zaGFwZShkYXRfbWFwKSArIAogIHRtX2ZpbGwoIlQiLCBwYWxldHRlID0gInZpcmlkaXMiKSArCiAgdG1fbGF5b3V0KGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwgZnJhbWUgPSBGQUxTRSkgKwogIHRtX3RleHQoInByb3ZpbmNlIiwgc2l6ZSA9ICJTaGFwZV9BcmVhIiwgIGF1dG8ucGxhY2VtZW50ID0gRiwgbGVnZW5kLnNpemUuc2hvdyA9IEZBTFNFKSAKYGBgCgoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsIHBhbGV0dGUgPSAidmlyaWRpcyIpICsKICB0bV9sYXlvdXQobGVnZW5kLm91dHNpZGUgPSBUUlVFLCBmcmFtZSA9IEZBTFNFKSArCiAgdG1fdGV4dCgicHJvdmluY2UiLCBzaXplID0gIlNoYXBlX0FyZWEiLCAgYXV0by5wbGFjZW1lbnQgPSBUUlVFLCBsZWdlbmQuc2l6ZS5zaG93ID0gRkFMU0UpIApgYGAKCgoKCiMjIFNldCBjb2xvciBpbnRlcnZhbHMKCkVudGVyIOKAnHN0eWxlID3igJ0gZm9sbG93ZWQgYnkgb25lIG9mIHRoZSBvcHRpb25zIGJlbG93LgoKLSBlcXVhbDogZGl2aWRlcyB0aGUgcmFuZ2Ugb2YgdGhlIHZhcmlhYmxlIGludG8gbiBwYXJ0cy4KLSBwcmV0dHk6IGNob29zZXMgYSBudW1iZXIgb2YgYnJlYWtzIHRvIGZpdCBhIHNlcXVlbmNlIG9mIGVxdWFsaXR5IHNwYWNlZCDigJhyb3VuZOKAmSB2YWx1ZXMuIAotIHF1YW50aWxlOiBlcXVhbCBudW1iZXIgb2YgY2FzZXMgaW4gZWFjaCBncm91cAotIGplbmtzOiBsb29rcyBmb3IgbmF0dXJhbCBicmVha3MgaW4gdGhlIGRhdGEKLSBjYXQ6IHdoZW4gdGhlIHZhcmlhYmxlIGlzIGNhdGVnb3JpY2FsIAoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsCiAgICAgICAgICBzdHlsZSA9ICJxdWFudGlsZSIsCiAgICAgICAgICBwYWxldHRlID0gIlJlZHMiCiAgICApICsKICB0bV9sYXlvdXQoCiAgICBsZWdlbmQub3V0c2lkZSA9IFRSVUUsCiAgICBmcmFtZSA9IEZBTFNFKQpgYGAKCkNoYW5nZSB0aGUgbnVtYmVyIG9mIGludGVydmFscyBpbiB0aGUgY29sb3Igc2NoZW1lIGFuZCBob3cgdGhlIGludGVydmFscyBhcmUgc3BhY2VkLiBDaGFuZ2luZyB0aGUgbnVtYmVyIG9mIGludGVydmFscyBuID0gNy4gU28sIHdlIGhhdmUgNyBzaGFkZXMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCA1LgoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsCiAgICAgICAgICBzdHlsZSA9ICJxdWFudGlsZSIsCiAgICAgICAgICBuID0gNywKICAgICAgICAgIHBhbGV0dGUgPSAiUmVkcyIKICAgICkgKwogIHRtX2xheW91dCgKICAgIGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwKICAgIGZyYW1lID0gRkFMU0UpCmBgYAoKCgojIyBBZGQgaGlzdG9ncmFtCgpgYGB7cn0KdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwKICAgICAgICAgIHN0eWxlID0gInF1YW50aWxlIiwKICAgICAgICAgIG4gPSA1LAogICAgICAgICAgcGFsZXR0ZSA9ICJZbE9yQnIiLAogICAgICAgICAgbGVnZW5kLmhpc3QgPSBUUlVFCiAgICApICsKICB0bV9sYXlvdXQoCiAgICBsZWdlbmQub3V0c2lkZSA9IFRSVUUsCiAgICBmcmFtZSA9IEZBTFNFKQpgYGAKCgojIyBBZGQgYm9yZGVycwoKWW91IGNhbiBlZGl0IHRoZSBib3JkZXJzIG9mIHRoZSBzaGFwZWZpbGUgd2l0aCB0aGUgdG1fYm9yZGVycygpIGZ1bmN0aW9uIHdoaWNoIGhhcyBtYW55IGFyZ3VtZW50cy4gYWxwaGEgZGVub3RlcyB0aGUgbGV2ZWwgb2YgdHJhbnNwYXJlbmN5IG9uIGEgc2NhbGUgZnJvbSAwIHRvIDEgd2hlcmUgMCBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LgoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsCiAgICAgICAgICBzdHlsZSA9ICJxdWFudGlsZSIsCiAgICAgICAgICBwYWxldHRlID0gIkJsdWVzIgogICAgKSArIAogIHRtX2JvcmRlcnMoYWxwaGE9LjQpICsKICB0bV9sYXlvdXQoCiAgICBsZWdlbmQub3V0c2lkZSA9IFRSVUUsCiAgICBmcmFtZSA9IEZBTFNFKQpgYGAKCiMjIEFkZCBjb21wYXNzCgpgYGB7cn0KdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwKICAgICAgICAgIHN0eWxlID0gInF1YW50aWxlIiwKICAgICAgICAgIHBhbGV0dGUgPSAidmlyaWRpcyIKICAgICkgKyAKICB0bV9ib3JkZXJzKGFscGhhPS40KSArIAogIHRtX2NvbXBhc3MoKSArCiAgdG1fbGF5b3V0KAogICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFLAogICAgZnJhbWUgPSBGQUxTRSkKYGBgCgojIyBFZGl0IHRoZSBsYXlvdXQKCmBgYHtyfQp0bV9zaGFwZShkYXRfbWFwKSArIAogIHRtX2ZpbGwoIlQiLAogICAgICAgICAgcGFsZXR0ZSA9ICJ2aXJpZGlzIiwKICAgICAgICAgIHN0eWxlID0gInF1YW50aWxlIiwKICAgICAgICAgIHRpdGxlID0gIlRlcnJvcmlzdCBBdHRhY2tzIgogICAgICAgICAgKSArIAp0bV9ib3JkZXJzKGFscGhhPS40KSArIAp0bV9sYXlvdXQoCiAgbGVnZW5kLnRleHQuc2l6ZSA9IDAuNywKICBsZWdlbmQudGl0bGUuc2l6ZSA9IDEsCiAgbGVnZW5kLnBvc2l0aW9uID0gYygicmlnaHQiLCAiYm90dG9tIiksCiAgbGVnZW5kLm91dHNpZGUgPSBUUlVFLAogIGZyYW1lID0gRkFMU0UKICApIApgYGAKCgojIyBJbnRlcmFjdGl2ZSBtYXAKCmBgYHtyfQp0bWFwX21vZGUoInZpZXciKQoKdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwgcGFsZXR0ZSA9ICJ2aXJpZGlzIikgKwogIHRtX2xheW91dChsZWdlbmQub3V0c2lkZSA9IFRSVUUsIGZyYW1lID0gRkFMU0UpIAoKdG1hcF9tb2RlKCJwbG90IikKYGBgCgoKCgojIFNhdmUgYSBuZXcgc2hhcGVmaWxlCgpgYGB7ciBldmFsPUZBTFNFfQpzdF93cml0ZShkYXRfbWFwLCAiZGF0X21hcC5zaHAiKQpgYGAKCgoKIyBSZWZlcmVuY2VzCgotIFtQcmFjdGljYWwgNTogTWFraW5nIG1hcHMgaW4gUl0oaHR0cHM6Ly9kYXRhLmNkcmMuYWMudWsvdHV0b3JpYWwvYWE1NDkxYzktY2JhYy00MDI2LTk3YzktZjkxNjg0NjJmNGFjLzcwYzRiYzYxLTA0NzUtNDgwNi05MjQwLTRlZjFmYTY0OWEwNikKCi0gW01vZGVybiBHZW9zcGF0aWFsIERhdGEgQW5hbHlzaXMgd2l0aCBSXShodHRwOi8vZmlsZXMuemV2cm9zcy5jb20vd29ya3Nob3BzL3NwYXRpYWwvc2xpZGVzL2h0bWwvMC1kZWNrLWxpc3QuaHRtbCkKCgojIERhdGFzZXRzCgotIFtOb24tc3BhdGlhbF0oaHR0cHM6Ly9naXRodWIuY29tL3F1YXJjcy1sYWIvdHV0b3JpYWwtbWFwcy1pbi1yL2Jsb2IvbWFzdGVyL0RBVEFTRVQuemlwP3Jhdz10cnVlKQotIFtTcGF0aWFsXShodHRwczovL2dpdGh1Yi5jb20vcXVhcmNzLWxhYi90dXRvcmlhbC1tYXBzLWluLXIvYmxvYi9tYXN0ZXIvTUFQLnppcD9yYXc9dHJ1ZSkgCi0gW0NvbWJpbmVkXShodHRwczovL2dpdGh1Yi5jb20vcXVhcmNzLWxhYi90dXRvcmlhbC1tYXBzLWluLXIvYmxvYi9tYXN0ZXIvdHVya2V5X2FkbWluMV9tZXJnZTNfYWxsLnppcD9yYXc9dHJ1ZSkKCkVORAo=